using System;
using Npgsql;

namespace LayerData
{
    public interface IPostgreSqlConnectionInfo
    {
        /// <summary>
        /// varible que permite determinar si va ha trabajar con tranzacciones 
        /// </summary>
        Boolean Transaccion { get; set; }
        /// <summary>
        /// tsq tranzacciones para el nivel de procesos
        /// </summary>
        NpgsqlTransaction Transacc { get; set; }
        /// <summary>
        /// Nombre del Servidor(default: localhost)
        /// </summary>
        string ServerName { get; set; }

        /// <summary>
        /// Numero de Puerto (default : 5432)
        /// </summary>
        int PortNumber { get; set; }

        /// <summary>
        /// Obtiene el nombre de la base de datos actual o de la base de datos para ser utilizado 
        /// después de la conexión se abre.
        /// </summary>
        string DataBaseName { get; set; }

        /// <summary>
        /// Passowrd del Usuario (Default: postgres)
        /// </summary>
        string Password { get; set; }

        bool Pooling { get; set; }

        /// <summary>
        /// Inidica si se usara seguridad integrada de windows( default: False)
        /// </summary>
        bool ItengratedSecurity { get; set; }

        /// <summary>
        /// Indica el numero maximo de conexion
        /// </summary>
        int MaxPoolSize { get; set; }

        /// <summary>
        /// Obtiene o establece si se usara Seguridad SSL
        /// </summary>
        bool Ssl { get; set; }

        /// <summary>
        /// Obtiene o establece el tiempo de espera para intentar establecer una conexión 
        /// antes de terminar el intento y generar un error.
        /// </summary>
        int ConnectionTimeout { get; set; }

        /// <summary>
        /// Nombre del Usario(Defualt: postgres)
        /// </summary>
        string UserName { get; set; }

        /// <summary>
        /// Obtiene el tiempo de espera al intentar ejecutar un comando antes de terminar el intento y generar un error.
        /// </summary>
        int CommandTimeout { get; set; }

        /// <summary>
        /// Obtiene el tiempo de espera antes de cerrar conexiones no utilizadas en el grupo de conexion, 
        /// si el recuento de todas las conexiones supera MinPoolSize.
        /// </summary>
        int ConnectionLifeTime { get; set; }

        /// <summary>
        /// Devuelve el Connection String para conectarse al Servidor.
        /// </summary>
        /// <returns></returns>
        string GetStringPostgreSqlConnection();

        /// <summary>
        /// Devuelve un Nuevo NpgsqlConnection
        /// </summary>
        /// <returns></returns>
        NpgsqlConnection GetPostgreSqlConnection();

        /// <summary>
        /// Cierra una conexion 
        /// </summary>
        /// <param name="con">Conexion a cerrar</param>
        void CloseConnection(NpgsqlConnection con);

        /// <summary>
        /// Abre una conexion
        /// </summary>
        /// <param name="con">Conexion a abrir.</param>
        void OpenConnection(NpgsqlConnection con);

        void AbrirConexionTrans(NpgsqlConnection con);

        void CerrarConexionTrans(NpgsqlConnection con);

        void CancelarConexionTrans(NpgsqlConnection con);

        /// <summary>
        /// Comit a una NpgsqlTransaction
        /// </summary>
        /// <param name="tran"></param>
        void CommintTransaction(NpgsqlTransaction tran);

        /// <summary>
        /// Crea una Instancia de NpgsqlTransaction y abre la conexion a la Base de Datos.
        /// </summary>
        /// <param name="con"></param>
        /// <returns></returns>
        NpgsqlTransaction GetTransaction(NpgsqlConnection con);
    }
}